import random
import time

"""
列表练习题-初始
# 1. 创建一个列表`list1`，其包含元素 1, 2, 3, 4, 5。
list1 = [1, 2, 3, 4, 5]
# 2. 向`list1` 添加一个元素 6。
list1.append(6)
# 3. 从`list1` 中删除元素 3。
list1.remove(3)
# 4. 修改`list1` 中的第二个元素值为 8。
list1[1] = 8
# 5. 找出`list1` 中值为 8 的元素索引。
print(list1.index(8))
# 6. 遍历`list1`，打印每个元素的值。
for i in list1:
    print(f"{i}\t", end="")
print()
# 7. 利用循环，将一个新列表 `7, 8, 9]` 的每个元素添加到`list1` 的末尾。
list2 = [7, 8, 9]
for i in list2:
    list1.append(i)
# 8. 使用一个命令，将列表 `10, 11, 12]` 添加到`list1` 的末尾。
list1 = list1 + [10, 11, 12]
# 9. 使用切片操作，获取`list1` 第三个元素到第五个元素（包含第五个元素）。
print(list1[2:5])
# 10. 将`list1` 的第三个元素修改为两个新元素 `13, 14]`（不是列表中的一个列表，而是将两个新元素插入到指定位置）。
list1[2:3] = [13, 14]
"""
import random
from statistics import mean

"""
列表练习题-进阶
my_list = [3, "apple", 9, "banana", 7, "cherry", 2, "date", 5, "elderberry"]
# 1. 向my_list中添加一个元素"fig"。
my_list.append("fig")
# 2. 从my_list中删除元素"banana"。
my_list.remove("banana")
# 3. 将元素7修改为字符串"grape"。
my_list[my_list.index(7)] = "grape"
# 4. 查找并打印元素"cherry"的索引值。
print(my_list.index("cherry"))
# 5. 遍历my_list并打印每个元素。
for i in my_list:
    print(f"{i}\t", end="")
print()
# 6. 在"cherry"后面插入新元素"kiwi"。
my_list.insert(my_list.index("cherry") + 1, '"kiwi"')
# 7. 使用索引查找并打印第三个元素。
print(my_list[2])
# 8. 使用负数索引找到并打印倒数第二个元素。
print(my_list[-2])
# 9. 使用切片操作获取第三个至第七个元素并打印结果。
print(my_list[2:7])
# 10. 使用切片操作反转整个列表并打印结果。
print(my_list[::-1])
# 11. 对列表中的字符串进行排序，并保留数字在原位。
strings = [item for item in my_list if isinstance(item, str)]
strings.sort()
new_my_list = []
strings_index = 0
for item in my_list:
    if isinstance(item, str):
        new_my_list.append(strings[strings_index])
        strings_index += 1
    else:
        new_my_list.append(item)
print(new_my_list)
del my_list
my_list = new_my_list
print(my_list)

# 12. 将my_list中的数字替换为它们对应的字符串形式（如1->'one'），不改变列表中原有的字符串。
print(1)
number = ['zero', 'one', 'two', 'there', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
print(my_list)
for num in my_list:
    if isinstance(num, int):
        num_index = my_list.index(num)
        n_index = int(int(my_list[num_index])/1)
        my_list[num_index]=number[n_index]
print(my_list)
"""

"""
列表练习题-复杂
# 1. 创建一个列表包含从1到100的所有偶数。
even_number_list = [item for item in range(0, 101) if item % 2 == 0]
# 2. 将上述列表中所有偶数替换为它们的平方。
i_index = -1
for i in even_number_list:
    i_index += 1
    even_number_list[i_index] = int(even_number_list[i_index]) ** 2
print(even_number_list)
# 3. 从上述列表中删除所有大于1000的数字。
re_list = []
for i in even_number_list:
    if i > 1000:
        re_list.append(i)
print(re_list)
for item in re_list:
    even_number_list.remove(item)
print(even_number_list)
# 4. 将列表逆序。
even_number_list.reverse()
# 5. 使用切片操作取出列表中的前10个元素。
print(even_number_list[:10:1])
# 6. 将一个新列表`[101, 102, 103]`加到现有列表的末尾。
even_number_list = even_number_list + [101, 102, 103]
# 7. 计算列表中元素的平均值。
total = 0
for i in even_number_list:
    total += i
avg = total / len(even_number_list)
print(avg)
# 8. 找到列表中的最大值和最小值。
max_value = max(even_number_list)
min_value = min(even_number_list)
# 9. 找出列表中第一次出现的11的索引位置。
cou = 0
for eleven in even_number_list:
    cou += 1
    if int(eleven) == 11:
        eleven_index = even_number_list.index(11)
        print(eleven_index)
        break
    elif cou == len(even_number_list) - 1:
        print("没有11这个值")
# 10. 用循环遍历列表，把每个数字替换为其对应的字符形式（例如：1替换为'1'）。注意使用不同类型的循环来实现。
str_even_number_list = [str(item) for item in even_number_list if
                        isinstance(item, (int, float))]
# 11. 将列表中的所有元素转换成浮点数形式。
float_even_number_list = [float(item) for item in even_number_list if
                          isinstance(item, (int, float))]
# 12. 找出列表中所有大于50的元素个数。
fifty_number = 0
for fifty in even_number_list:
    if fifty > 50:
        fifty_number += 1
    else:
        pass
print(even_number_list, len(even_number_list), fifty_number)
# 13. 在列表的第3个位置插入数字99。
even_number_list.insert(2, 99)
# 14. 删除列表中的最后一个元素。
even_number_list.pop()
# 15. 使用列表推导式创建一个新列表，包含原列表中每个数字乘以2的结果。
new_square_even_number_list = [item ** 2 for item in even_number_list if isinstance(item, (int, float))]
# 16. 将列表分成两部分，一部分是小于等于50的数，另一部分是大于50的数。
left_list = [item for item in even_number_list if item <= 50]
left_list.sort()
right_list = [item for item in even_number_list if item > 50]
right_list.sort()
left_right_even_number_list = []
left_right_even_number_list.append(left_list)
left_right_even_number_list.append(right_list)
# 17. 将列表转换为一个字典，其中列表元素作为键，其在列表中的索引作为值。
dictionary = {}
for item in even_number_list:
    dictionary[item] = even_number_list.index(item)
# 18. 使用`enumerate`函数遍历列表，并打印元素及其索引。
for index, item in enumerate(even_number_list):
    print(f"元素：{item}，索引：{index} | ", end="")
print()
# 19. 从列表中随机取出一个元素。
print(random.choice(even_number_list))
# 20. 将列表保存到一个txt文件里，每个元素占一行。
with open('0611day02.txt', 'w') as fp:
    [fp.write(str(item) + '\n') for item in even_number_list]
    fp.close()
print(even_number_list)
"""
# --------------------------------------------------------------------------------
# 0612day03
'''
#字典练习题 - 基础
person_info = {"name": "Alex",
               "age": 30,
               "country": "USA",
               "language": ["English", "Spanish"],
               "is_student": False}
# 1.打印`person_info` 字典的`name` 值。
print(person_info["name"])
# 2.. 修改`age` 的值为 31。
person_info["age"] = 13
# 3.向字典中添加一个新的键值对 `height": 175`。
person_info["height"] = 175
# 4.删除字典中的 `is_student"` 键及其值。
del person_info["is_student"]
# 5.使用循环遍历字典，打印所有的键和值。
print("所有键值对：")
for e in person_info.items(): print(e)
# 6.检查字典中是否有 `email"` 这个键，如果没有，添加 `email": "alex@example.com"`。
person_info["email"] = "alex@example.com"
# 7.将`language` 的值改为只包含 `English"`。
person_info["language"] = ["English"]
# 8.获取并打印字典中`language` 列表的长度。
print(len(person_info["language"]))
# 9.向`language` 列表中添加一种新语言 `French"`。
person_info["language"].append("French")
# 10.循环插入新的键值对到字典：将 ` hobby'` + 数字 作为键，相应的 ` hobby'` + 数字值 作为值，数字从1至3。
for i in range(1, 4):
    person_info[f"hobby{i}"] = f"hobby{i}"
print(person_info)
'''

'''
#字典练习题-进阶
employees = {
    101: {
        "name": "Alice",
        "age": 30,
        "gender": "Female",
        "position": "Data Scientist",
        "team": "Research",
        "salary_history": [70000, 80000, 90000]
    },
    # 更多员工数据...
}
# 1. 新增一个员工的信息到`employees`字典中。
employees[102] = {"name": "kanye",
                  "age": 30,
                  "gender": "Male",
                  "position": "Soft Scientist",
                  "team": "Research",
                  "salary_history": [70000, 80000, 90000]}
# 2. 删除一个指定的员工的信息。
del employees[102]
# 3. 更新员工101的年龄至31。
employees[101]["age"] = 31
# 4. 增加员工101薪资历史中的最新薪资至95000。
employees[101]["salary_history"].append(95000)
print(len(employees[101]["salary_history"]))
# 5. 计算员工101的平均薪资。
print(mean(employees[101]["salary_history"]))
# 6. 找出所有年龄大于25岁的员工的姓名和ID。
result = {id: name["name"]
          for id, name in employees.items() if name["age"] > 25}
print(result)
# 7. 对`employees`中的每个员工，添加'bonus'键至其字典中，其中值是最新薪资的10%。
for key, value in employees.items():
    new_value = value["salary_history"][-1]
    bonus = new_value * 0.1
    value["bonus"] = bonus
# 8. 将员工101的职位更新为"Senior Data Scientist"。
employees[101]["position"] = "Senior Data Scientist"
# 9. 从员工的信息中移除`gender`键。
for id, emp in employees.items():
    del emp["gender"]
# 10. 创建一个新的嵌套字典，该字典仅包含员工的`name`和`position`。
new_dictionary = {id: {key: emp[key] for key in ["name", "position"]}
                  for id, emp in employees.items()}
'''

'''
#字符串练习题-基础
s = "Hello,Python world!"
# 1.字符串长度计算
print(len(s))
# 2.计算字符串中"o"字符的个数
print(s.count("o"))
# 3.将字符串转换为大写
print(s.lower())
# 4.将字符串转换为小写
print(s.upper())
# 5.查找"Python"在字符串中的位置
print(s.find("Python"))
# 6.替换字符串中的"world"为"universe"
s = s.replace('world', 'universe')
# 7.检查字符串是否以"Hello"开始
print(s.startswith('Hello'))
# 8.检查字符串是否以"!"结尾
print(s.startswith('!', -1))
# 9.以","为分隔符，拆分字符串
s_, _list = s.split(',')
# 10.去除字符串首尾的"!"
d_s = s.strip("!")
# 11.字符串反转
print(s[::-1])
# 12.字符串切片，获取"Python"
python = s[s.find("Python"):s.find("Python") + len("Python")]
# 13.将字符串s中的"Hello,"删除
s_de_hello = s.strip("Hello,")
# 14.拼接两个字符串"Hello,"和"World!"
s1 = "Hello,"
s2 = "World!"
s_12 = s1 + s2
# 15.使用f - string合并字符串和数字2021
print(f"{s}{2021}")
# 16.找出'a'第一次出现的位置
s_s = s.find("a")
# 17.找出'e'最后一次出现的位置
s_e = s.find("e", -1)
# 18.计算字符串中空格的数量
s_space = s.count(" ")
# 19.使用循环遍历字符串中的每个字符
for i in s:
    print(i, end="")
print()
# 20.将字符串转为"列表"形式，每个字符为一个列表元素
# s_list = [item for item in s]
s_list1 = list(s)
# 21.字符串排序（提示：先转换为列表）
s_list2 = list(s)
s_list2.sort()
s_sort = "".join(s_list2)
# 22.判断字符串是否为数字
for item in s:
    if type(item) != int or float:
        print("字符串不是数字")
        break
    else:
        print("字符串是数字")
# 23.将列表`['Hello,', 'Python', 'World!']`使用空格连接为一个字符串
list_space = ['Hello,', 'Python', 'World!']
s_list_space = " ".join(list_space)
# 24.使用 % 操作符格式化字符串，将数字100插入到"Number: "后面
print("Number: %s" % (100))
# 25.检查字符串是否全部为小写字母
if s == s.lower():
    print("全是小写字母")
    # 26.检查字符串是否全部为大写字母
elif s == s.upper():
    print("全是大写字母")
else:
    print("既不全是大写字母也不全是小写字母")
# 27.将数字列表`[1, 2, 3]`转换成字符串，元素之间用`-`连接
numbers_list = [1, 2, 3]
# s_number = "-".join(numbers_list)
# 28.找出字符串中所有的"o"的位置
# 28(1)使用for循环
# o_index = -1
# print(s)
# for i in s:
#     o_index += 1
#     if i == "o":
#         print(f"{o_index}, | ", end="")
# print()
# 28(2)使用enumerate函数
char_index = 0
for char_index, char in enumerate(s):
    if char == "o":
        print(char_index)
# 29.替换字符串中的第一个"o"为"O"
s = s.replace('o', '0', 1)
# 30.字符串插入操作，向字符串指定位置插入子字符串"amazing "
ama_s = "amazing"
list_ama = list(s)
print(f"指定位置范围为0到{len(list_ama) - 1}")
x = int(input(f"请输入指定位置插入字符串："))
list_ama.insert(x, ama_s)
ama_str = "".join(list_ama)
print(ama_str)
'''

'''
#字符串练习题-进阶
s = "Python is great!"
# 1. 字符串反转:给定字符串`s="Python is great!"`，不使用任何内置函数，编写代码以反转字符串。
r_s = s[::-1]
print(r_s)
# 2. 字符计数:对于同一个字符串`s`，计算字符 `t'`在其中出现的次数。
s_t_numbers = s.count("t")
print(s_t_numbers)
# 3. 替换字符:把字符串`s`中的所有空格替换成下划线``。
s_space_replace_s = s.replace("s", "_")
print(s_space_replace_s)
# 4. 检查回文:检查字符串`s2="A man,a plan,a canal,Panama!"`在忽略大小写、标点和空格的情况下是否为回文字符串。
s2 = "A man,a plan,a canal,Panama!"
palindrome_s = ''.join(i for i in s if i.isalnum()).upper()
is_palindrome_s = palindrome_s[::-1]
if is_palindrome_s == palindrome_s:
    print("是回文数")
else:
    print("不是回文数")
# 5. 子字符串查找:在`s`中查找第一次出现子字符串`is"`的位置。
is_index = s.find("is", 1)
# 6. 字符串插入:在`s`中第一个`t'`字符之后插入子字符串`"_inserted"`。
t_insert = "_inserted"
t_index = s.index("t")
if t_index != -1:
    t_s = s[:t_index + 1] + t_insert + s[t_index + 1:]
    print(t_s)
else:
    print("字符串s中不存在字符‘t’")
# 7. 部分替换:替换`s`中第一次出现的`great"`为`awesome"`。
replace_gr_aw = s.replace("great", "awesome", 1)
# 8. 切片与拼接:将`s`切分为两部分，其中第一部分包含前半部分的字符，第二部分包含后半部分的字符，然后将这两部分以相反顺序拼接起来。
s_split_index = int(len(s) / 2) - 1
s_split = s[s_split_index:] + '' + s[:s_split_index]
# 9. 创建字符串列表:使用列表生成式，根据字符串`s`创建一个列表，其中包含`s`的每个单词的首字母大写形式。
title_words_list = [word.title() for word in s.split()]


# 10. 字符替换加密:编写一个函数`encrypt`，使用字典`a:m,b:n,...z:l}`的对应规则加密字符串`s3="encryption"`。
def encrypt(string):
    encrypted = ""
    for char in string:
        if char.isalpha():
            # 确定字符的ASCII偏移量（0-25）
            base = ord('a') if char.islower() else ord('A')
            # 应用ROT13变换（移动13位）
            shifted = (ord(char) - base + 13) % 26
            # 转回字符并添加到结果中
            encrypted += chr(base + shifted)
        else:
            # 非字母字符保持不变
            encrypted += char
    return encrypted
'''

'''
#购物系统业务需求1.0：
# 用户账户余额以及用户购物车
user_account = 10000
Shopping_cart = []
print(f"用户账户余额为{user_account}元！")
# 编写购物流程代码
# 购前：设计商品列表以及价格列表
goods_dictionary = {"图书": 10, "可乐": 3, "游戏机": 1000, "爆米花": 10, "记事本": 5, "办公笔记本": 3000,
                    "游戏笔记本": 7000, "矿泉水": 2, "奶茶": 5, "烤肠": 3, "短袖": 60, "篮球": 90}
goods_list = [item for item in goods_dictionary.keys()]
goods_price = [item for item in goods_dictionary.values()]
print(f"本商场商品列表如下：{goods_dictionary}")
# 购中：检测是否有这个商品
while True:
    goods = input("准备购买哪个商品：")
    if goods in goods_list:
        goods_index = goods_list.index(goods)
        if user_account - goods_price[goods_index] >= 0:
            Shopping_cart.append(goods_list[goods_index])
            user_account -= goods_price[goods_index]
            print(f"恭喜，购买成功！您的卡余额还剩{user_account}元！")
            # 购后：打印购物小票
            x = input("是否继续购买？（Y/y继续，Q/q退出购买）：")
            if x == "Y" or x == "y":
                pass
            elif x == "Q" or x == "q":
                print(f"当前购物车商品为{Shopping_cart}")
                break
            else:
                print("输入错误，程序退出!")
                print(f"当前购物车商品为{Shopping_cart}")
                break
        else:
            print("穷鬼，钱不够！请到其他超市购买！")
            break
    else:
        print("没有这个商品，别瞎弄！")
        break
'''
'''
# 购物系统业务需求2.0
# 用户账户余额以及用户购物车
user_account = 10000
original_user_account = user_account
Shopping_cart = []
# 设计优惠券
goods_discount = {"矿泉水": 0.5, "可乐": 0.5, "烤肠": 0.5, "奶茶": 0.6, "爆米花": 0.6, "记事本": 0.6, "图书": 0.5,
                  "短袖": 0.6, "篮球": 0.8, "游戏机": 0.95, "办公笔记本": 0.95, "游戏笔记本": 0.90}
discount_good_name = random.choice(list(goods_discount))
discount_good_price = goods_discount[f"{discount_good_name}"]
user_discount = discount_good_name
discount_number = 1
current_time = time.asctime()
print(f"用户账户余额为{user_account}元！")
print(f"恭喜您！抽到优惠券{discount_good_price * 10}折购{discount_good_name}！")
# 编写购物流程代码
# 购前：设计商品列表以及价格列表
goods_dictionary = {"矿泉水": 2, "可乐": 3, "烤肠": 3, "奶茶": 5, "爆米花": 10, "记事本": 5, "图书": 10,
                    "短袖": 60, "篮球": 90, "游戏机": 1000, "办公笔记本": 3000, "游戏笔记本": 7000}
goods_list = [item for item in goods_dictionary.keys()]
goods_price = [item for item in goods_dictionary.values()]
print(f"本商场商品列表如下：{goods_dictionary}")
value = True
# 购中：检测是否有这个商品
while value:
    goods = input("准备购买哪个商品：")
    if goods in goods_list:
        goods_index = goods_list.index(goods)
        if goods == discount_good_name and discount_number == 1:
            if user_account - goods_price[goods_index] * discount_good_price >= 0:
                Shopping_cart.append(goods_list[goods_index])
                user_account -= goods_price[goods_index] * discount_good_price
                print(f"恭喜，购买成功！您的卡余额还剩{user_account}元！")
                print("此购物券已生效，限购一次，再次购买将为原价!")
                discount_number -= 1
        elif user_account - goods_price[goods_index] >= 0:
            Shopping_cart.append(goods_list[goods_index])
            user_account -= goods_price[goods_index]
            print(f"恭喜，购买成功！您的卡余额还剩{user_account}元！")
            # 购后：打印购物小票
        else:
            print("穷鬼，钱不够！请到其他超市购买！")
            if len(Shopping_cart) > 0:
                print(
                    f"当前购物车商品为{Shopping_cart},购物时间为{current_time},购物数量为{len(Shopping_cart)},商品总价值为{original_user_account - user_account}")
            else:
                break
        x = input("是否继续购买？（Y/y继续，Q/q退出购买，T/t退货某商品）：")
        if x == "Y" or x == "y":
            pass
        elif x == "T" or x == "t":
            while True:
                print(Shopping_cart)
                return_name = input("请输入要退货商品：")
                return_number = 1
                if return_name in Shopping_cart:
                    Shopping_cart.remove(return_name)
                    goods_index = goods_list.index(return_name)
                    if return_name == discount_good_name and return_number == 1:
                        user_account += goods_price[goods_index] * discount_good_price
                        discount_number = 0
                    else:
                        user_account += goods_price[goods_index]
                    print(f"退货成功，当前账户余额{user_account}")
                    x = input("是否继续退货？（Y/y继续，N/n退出）：")
                    if x == "Y" or x == "y":
                        pass
                    if x == "N" or x == "n":
                        break
                else:
                    print("没有这个商品，别瞎弄！")
                    break
        elif x == "Q" or x == "q":
            print(
                f"当前购物车商品为{Shopping_cart},购物时间为{current_time},购物数量为{len(Shopping_cart)},商品总价值为{original_user_account - user_account}")
            value = False
        else:
            print("输入错误，程序退出!")
            print(
                f"当前购物车商品为{Shopping_cart},购物时间为{current_time},购物数量为{len(Shopping_cart)},商品总价值为{original_user_account - user_account}")
            value = False
    else:
        print("没有这个商品，别瞎弄！")
        break
'''
